Recursos:
Wickham, H., & Grolemund, G. (2017). R for data science: Import, tidy, transform, visualize, and model data. Retrieved from: http://r4ds.had.co.nz; Versión pdf
Li
Y. y Baron J. (2012). Behavioral Research Data Analysis with R.
Springer
Preliminares: librerías
library("tidyverse")
library("ds4psy")
library("data.table")
Cita: Ramos-Álvarez, M.M. (2017).Introducciòn a R. Recuperado 15 septiembre 2024, desde http://www4.ujaen.es/~mramos/ADMmRa/IntroduceR.pdf
Ejemplo extraído de: Ramos-Álvarez, M.M. (2020). Bases Conceptuales del Análisis de Datos.
Imagine que realiza una investigación sobre la influencia de las técnicas de entrenamiento cognitivo basado en el programa Brain TrainingTM. En concreto usted y otros tres compañeros reciben entrenamiento de este tipo y después de tres sesiones obtienen las puntuaciones 9, 8, 7 y 8 respectivamente en una prueba de memoria.
Supongamos que aplicamos a otro grupo de 4 compañeros tres sesiones con un video-juego también de la misma compañía de Brain TrainingTM pero que no refuerza la memoria, y observamos que éstos obtienen 5, 5, 7 y 7 puntos respectivamente.
Finalmente, se replica en otro grupo de profesores el estudio con el video-juego alternativo y se encuentran las puntuaciones 8, 1, 8 y 7.
La ejemplificación del proceso de Análisis de Datos a partir de esta sencilla investigación experimental sería la siguiente:
Fichero de datos para comprobaciones: BrainTrain.csv
Fichero con el código del tutorial en R Studio: CienciaDatosMmRaCode.Rmd
El objetivo de este módulo será aprender a establecer un esquema de trabajo óptimo (que no significa el mejor o el único) para estar en disposición de hacer Ciencia de Datos. De esta manera sentaríamos las bases para profundizar en los aspectos fundamentales a partir de los cuatro módulos posteriores. Para ello necesitamos una buena herramienta computacional de cálculo versátil y asequible. Esto lo conseguiremos de la mano del programa R (https://www.r-project.org) y el entorno R Studio (https://rstudio.com). Una vez que tengamos instalados los dos programas y nos hayamos familiarizado con los mismos, crearemos nuestro propio marco de trabajo en R Studio mediante un fichero del tipo R Markdown. En este marco podremos aprender a establecer nuestro propio esquema de trabajo para empezar a hacer Ciencia de Datos, de la mano del supuesto de prácticas inspirado en la investigación con Brain Training.
Todos los fragmentos de código que se incluyen en el tutorial están preparados de tal manera que pueda copiarlos en el portapapeles para pegarlos en su entorno de trabajo R-Mardown y editarlos con sus propias notas. Recuerde que puede incluir notas comenzando la línea con el símbolo de hashtag(‘#’), toda vez que se definen fragmentos de código Insertando ‘chunks’.
A continuación se incluye un resumen sobre el entorno R-Studio, el cual puede imprimir expresamente a partir del documento: R Studio IDE Guía Rápida
También se incluye un resumen para aprender a manejar los aspectos fundamentales del programa R en general, el cual puede también imprimir expresamente a partir del documento: Base R Cheat Sheet 1
1) Las librerías (packages) son fundamentales.
R es algo así como un programa de análisis con potencial, pero a la que
vamos añadiendo funcionalidad al indicarle las librerías específicas que
nos servirán para llevar a cabo aquellos análisis específicos que nos
interesan, o bien librerías que permiten manejar la información.
La fuente de referencia básica para encontrar las librerías será la
página oficial del programa R (https://cloud.r-project.org/web/packages/). En cada
sesión tenemos que recordar que hay que cargar las librerías de
interés.
Además, si es la primera vez, hay que instalarlas en nuestro entorno de
trabajo.
Empezamos a escribir en el código …
# Únicamente la primera vez insalaremos las librerías
# (quitamos momentáneamente el hashtag y después lo volvemos a incluir)
# install.packages("Rcmdr")
# Y entonces la cargamos en memoria
library(Rcmdr)
La librería R-Commander es una buena opción para iniciarse en R,
puesto que a través de un sistema de menús permite generar los comandos
de R para las opciones más representativas de análisis. En este momento
sería interesante que explorase la misma, intentando ubicar aquello que
es más importante en el análisis de los datos: Opciones de análisis como
descripción de los datos, ANOVA, representaciones gráficas, etc.
Una vez que la haya explorado, no olvide cerrar Rcmdr
Para familiarizarse con las Librerías y el Funcionamiento de R:
2) Preparamos la información a partir de los datos que nos interesan. Para ello codificamos los datos de Brain Tarining. Progresaremos desde el vector como unidad básica hacia los marcos (data.frame)
# Ejemplo 1 .- Brain Training
# Desde el vector como unidad básica hacia los marcos
Memoria <- c(9,8,7,8,5,5,7,7,8,1,8,7)
Grupos <- c("BrainT", "BrainT", "BrainT", "BrainT", "VideoJ", "VideoJ", "VideoJ",
"VideoJ", "RepVideoJ", "RepVideoJ", "RepVideoJ", "RepVideoJ")
Grupos<-as.factor(Grupos)
Hemos almacenado los datos de memoria en la variable denominada Memoria y la variable independiente en Grupos. En cualquier momento podemos explorar lo que contienen las variables a partir del panel derecho de R-Studio o sencillamente, de manera más interactiva, tecleando y ejecutando el nombre de dicha variable. Por ejemplo:
# Para explorar el contenido de la variable de medida (o variable dependiente)
Memoria
## [1] 9 8 7 8 5 5 7 7 8 1 8 7
# Para explorar el contenido de la variable independiente
Grupos
## [1] BrainT BrainT BrainT BrainT VideoJ VideoJ VideoJ
## [8] VideoJ RepVideoJ RepVideoJ RepVideoJ RepVideoJ
## Levels: BrainT RepVideoJ VideoJ
R incluye funciones muy potentes para la creación de estructuras de información: rep, seq, paste, gl, expand.grid
# Secuencias regulares
rep(3,4)
## [1] 3 3 3 3
NivGrupos <- c("BrainT", "VideoJ", "RepVideoJ")
rep(NivGrupos,4)
## [1] "BrainT" "VideoJ" "RepVideoJ" "BrainT" "VideoJ" "RepVideoJ"
## [7] "BrainT" "VideoJ" "RepVideoJ" "BrainT" "VideoJ" "RepVideoJ"
rep(x=NivGrupos,each=4)
## [1] "BrainT" "BrainT" "BrainT" "BrainT" "VideoJ" "VideoJ"
## [7] "VideoJ" "VideoJ" "RepVideoJ" "RepVideoJ" "RepVideoJ" "RepVideoJ"
seq(2,10) #ó c(2:10)
## [1] 2 3 4 5 6 7 8 9 10
seq(-2,-10,by=-1)
## [1] -2 -3 -4 -5 -6 -7 -8 -9 -10
paste0(c("X"), 1:10, sep="")
## [1] "X1" "X2" "X3" "X4" "X5" "X6" "X7" "X8" "X9" "X10"
gl(3, 4, label=NivGrupos)
## [1] BrainT BrainT BrainT BrainT VideoJ VideoJ VideoJ
## [8] VideoJ RepVideoJ RepVideoJ RepVideoJ RepVideoJ
## Levels: BrainT VideoJ RepVideoJ
# Secuencias aleatorias, por ej. a partir de una distribución
# Normal de media 0 y desviación típica la unidad
rnorm(50,0,1)
## [1] -0.91875481 -0.91094890 -0.86508669 -1.49070516 -0.81089466 -0.66443215
## [7] -0.30310748 -0.02459309 -1.04746694 -0.02930798 0.93499939 0.06644635
## [13] 0.63763889 -0.96810657 -0.99442532 0.41386486 -0.80968435 0.38842344
## [19] -1.28928310 0.46200179 -1.34304474 0.48687971 -0.07761775 0.96979735
## [25] 0.46234366 0.06767926 1.14500533 -0.09323287 0.60670630 0.77307430
## [31] 0.57208524 0.76432619 0.97769311 0.29247831 0.24798694 -0.99389473
## [37] 0.59816599 -0.74967864 0.21324368 1.17258564 1.05928237 1.09774276
## [43] 0.16668347 -0.27852517 0.62414864 0.40687564 0.85421448 1.25301072
## [49] 1.81207602 -1.35046191
Explore con detenimiento todas las opciones. Habrá podido constatar que prácticamente todas las operaciones en el programa se realizan a través de funciones, las cuales se aplican sobre argumentos. Por ejemplo rep incluye argumentos como x, times, each, algunos de los cuales tienen valores por defecto: rep(x, times = 1, length.out = NA, each = 1).
# analice los parámetros de algunas funciones
help(rep)
help(seq)
Ahora volvemos sobre variables del tipo categórico, con niveles, como es usual en las variables independientes; es decir con lo que R define como factores:
NivGrupos <- c("BrainT", "VideoJ", "RepVideoJ")
Grupos <- gl(3, 4, label=NivGrupos)
Grupos
## [1] BrainT BrainT BrainT BrainT VideoJ VideoJ VideoJ
## [8] VideoJ RepVideoJ RepVideoJ RepVideoJ RepVideoJ
## Levels: BrainT VideoJ RepVideoJ
Podemos constatar que esta forma de crear la variable Grupos es
preferible a la opción previa, aunque el resultado es prácticamente el
mismo.
Y ahora podemos juntar todas las partes (vectores) en una única
estructura de datos: los marcos (data.frame),
la estructura por excelencia en R.
Para entender esta estructura tan importante, la compararemos además con
otras estructuras relevantes, ligeramente diferentes en función del
objetivo que tiene dicha estructura de datos: las listas, estructuras
temporales o tablas.
# La estructura definitiva de datos: Marcos (data.frame)
BrainTrain <- data.frame(Grupos, Memoria)
BrainTrain
## Grupos Memoria
## 1 BrainT 9
## 2 BrainT 8
## 3 BrainT 7
## 4 BrainT 8
## 5 VideoJ 5
## 6 VideoJ 5
## 7 VideoJ 7
## 8 VideoJ 7
## 9 RepVideoJ 8
## 10 RepVideoJ 1
## 11 RepVideoJ 8
## 12 RepVideoJ 7
# Diferencia con las listas genéricas
list(Grupos, Memoria)
## [[1]]
## [1] BrainT BrainT BrainT BrainT VideoJ VideoJ VideoJ
## [8] VideoJ RepVideoJ RepVideoJ RepVideoJ RepVideoJ
## Levels: BrainT VideoJ RepVideoJ
##
## [[2]]
## [1] 9 8 7 8 5 5 7 7 8 1 8 7
# Estructuras con codificación temporal
# Asigna momentos temporales a las medidas de Memoria,
# por ejemplo una medida al mes que empezaron el 2º mes del año 2008.
ts(Memoria, frequency = 12, start = c(2008, 2))
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 2008 9 8 7 8 5 5 7 7 8 1 8
## 2009 7
# Tablas de frecuencias (contingencia)
table(Memoria,exclude = NULL)
## Memoria
## 1 5 7 8 9
## 1 2 4 4 1
Para familiarizarse con las Estructuras y Tipos de Datos, así como la creación de estructuras:
3) Ahora estamos en disposición de modificar la estructura original de datos. Para ello incluiremos algunas funciones adicionales algo más complejas para creación de estructuras e incorporaremos una nueva variable a los datos de Brain Training.
# Mas sobre estructuras de creación de información
expand.grid(a=c(1:2),sexo=c("Varon", "Mujer"),Grupos=NivGrupos)
## a sexo Grupos
## 1 1 Varon BrainT
## 2 2 Varon BrainT
## 3 1 Mujer BrainT
## 4 2 Mujer BrainT
## 5 1 Varon VideoJ
## 6 2 Varon VideoJ
## 7 1 Mujer VideoJ
## 8 2 Mujer VideoJ
## 9 1 Varon RepVideoJ
## 10 2 Varon RepVideoJ
## 11 1 Mujer RepVideoJ
## 12 2 Mujer RepVideoJ
NivGrupos <- c("BrainT", "VideoJ", "RepVideoJ")
Grupos <- gl(3, 4, label=NivGrupos)
Grupos
## [1] BrainT BrainT BrainT BrainT VideoJ VideoJ VideoJ
## [8] VideoJ RepVideoJ RepVideoJ RepVideoJ RepVideoJ
## Levels: BrainT VideoJ RepVideoJ
NivSex <- c("Varon", "Mujer")
Sex <- gl(2, 6, label=NivSex)
Sex
## [1] Varon Varon Varon Varon Varon Varon Mujer Mujer Mujer Mujer Mujer Mujer
## Levels: Varon Mujer
interaction(Grupos, Sex)
## [1] BrainT.Varon BrainT.Varon BrainT.Varon BrainT.Varon
## [5] VideoJ.Varon VideoJ.Varon VideoJ.Mujer VideoJ.Mujer
## [9] RepVideoJ.Mujer RepVideoJ.Mujer RepVideoJ.Mujer RepVideoJ.Mujer
## 6 Levels: BrainT.Varon VideoJ.Varon RepVideoJ.Varon ... RepVideoJ.Mujer
# Añadimos la variable Sexo a nuestro marco de datos
NivSex <- c("Varon", "Mujer")
BrainTrain$Sexo<-gl(2, 2, 12,label=NivSex)
BrainTrain
## Grupos Memoria Sexo
## 1 BrainT 9 Varon
## 2 BrainT 8 Varon
## 3 BrainT 7 Mujer
## 4 BrainT 8 Mujer
## 5 VideoJ 5 Varon
## 6 VideoJ 5 Varon
## 7 VideoJ 7 Mujer
## 8 VideoJ 7 Mujer
## 9 RepVideoJ 8 Varon
## 10 RepVideoJ 1 Varon
## 11 RepVideoJ 8 Mujer
## 12 RepVideoJ 7 Mujer
Y podemos resumir la información, esto será fundamental para ayudarnos en la comprensión de los datos.
# Con una única variable de agrupación
medias<-tapply(Memoria, Grupos, mean)
medias
## BrainT VideoJ RepVideoJ
## 8 6 6
# Caso general con más de una variable de agrupación
tapply(Memoria, list(Grupos,BrainTrain$Sexo), mean)
## Varon Mujer
## BrainT 8.5 7.5
## VideoJ 5.0 7.0
## RepVideoJ 4.5 7.5
with(BrainTrain, by(Memoria, list(Grupos,Sexo), mean))
## : BrainT
## : Varon
## [1] 8.5
## ------------------------------------------------------------
## : VideoJ
## : Varon
## [1] 5
## ------------------------------------------------------------
## : RepVideoJ
## : Varon
## [1] 4.5
## ------------------------------------------------------------
## : BrainT
## : Mujer
## [1] 7.5
## ------------------------------------------------------------
## : VideoJ
## : Mujer
## [1] 7
## ------------------------------------------------------------
## : RepVideoJ
## : Mujer
## [1] 7.5
with(BrainTrain, aggregate(Memoria, by=list(Grupos,Sexo), mean))
## Group.1 Group.2 x
## 1 BrainT Varon 8.5
## 2 VideoJ Varon 5.0
## 3 RepVideoJ Varon 4.5
## 4 BrainT Mujer 7.5
## 5 VideoJ Mujer 7.0
## 6 RepVideoJ Mujer 7.5
Es importante aprender acrear sus propias funciones, de cara a sistematizar las operaciones que prevé sobre los datos. En un sencillo ejemplo, vamos a definir una función para estimar el Error Típico de la Media (Varianza de los datos dividida por la raíz cuadrada del tamaño muestral), una medida de variabilidad o dispersión bastante recomendable.
ETM <- function(x) sqrt(var(x,na.rm=TRUE)/length(na.omit(x)))
# La aplicamos sobre nuestros datos
ETM(Memoria)
## [1] 0.6195469
# Y mejoramos un poco la legibilidad del resultado
ETM <- function(x) round(sqrt(var(x,na.rm=TRUE)/length(na.omit(x))),4)
ETM(Memoria)
## [1] 0.6195
Para familiarizarse con las Funciones:
Para familiarizarse con el Resumen de la Información a partir de Funciones Estadísticas:
4) Los Modelos estadísticos nos ayudarán a ir un
paso más allá gracias a la explicación de los datos.
Volviendo a la investigación de Brain Training, los datos medidos para
la Memoria se explicarían en este caso a partir de la variable Grupo de
entrenamiento. Este es el modelo estadístico más elemental, un modelo
lineal.
# Modelos Estadísticos
modelo <- as.formula(Memoria ~ Grupos)
ModLin<-lm(modelo,data = BrainTrain)
# Para obtener un resumen del modelo
summary(ModLin)
##
## Call:
## lm(formula = modelo, data = BrainTrain)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.0 -1.0 0.5 1.0 2.0
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.000 1.054 7.589 3.36e-05 ***
## GruposVideoJ -2.000 1.491 -1.342 0.213
## GruposRepVideoJ -2.000 1.491 -1.342 0.213
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.108 on 9 degrees of freedom
## Multiple R-squared: 0.2105, Adjusted R-squared: 0.03509
## F-statistic: 1.2 on 2 and 9 DF, p-value: 0.3452
Las estructuras de agrupación tipo apply
entrañan cierta complejidad. Es conveniente entender la lógica general
de las mismas.
Realmente algunas de las estructuras de datos incluyen de manera más o
menos explícita un resumen de la información, tal es el caso de las
tablas de contingencias. Dichas tablas se pueden además obtener a partir
de modelos.
xtabs(Memoria~Grupos+Sexo,data=BrainTrain)
## Sexo
## Grupos Varon Mujer
## BrainT 17 15
## VideoJ 10 14
## RepVideoJ 9 15
BrainTrainT<-ftable(xtabs(Memoria~Grupos+Sexo,data=BrainTrain))
BrainTrainT
## Sexo Varon Mujer
## Grupos
## BrainT 17 15
## VideoJ 10 14
## RepVideoJ 9 15
# En realidad es como:
aggregate(Memoria ~ Grupos + Sexo, data = BrainTrain, FUN = sum)
## Grupos Sexo Memoria
## 1 BrainT Varon 17
## 2 VideoJ Varon 10
## 3 RepVideoJ Varon 9
## 4 BrainT Mujer 15
## 5 VideoJ Mujer 14
## 6 RepVideoJ Mujer 15
# Podemos resumir aún más a través de la obtención de marginales
rowSums(BrainTrainT)
## [1] 32 24 24
colSums(BrainTrainT)
## [1] 36 44
Para familiarizarse con la familia Apply:
Para terminar este apartado repasamos, de manera comparativa, los tipos de datos
# Mas sobre tipos de Datos
typeof(Memoria)
## [1] "double"
typeof(medias[1])
## [1] "double"
typeof(anova(ModLin)$Df[1])
## [1] "integer"
typeof(NivGrupos)
## [1] "character"
typeof(Grupos)
## [1] "integer"
typeof(BrainTrain$Sexo)
## [1] "integer"
Para familiarizarse con los Modelos Estadísticos:
5) Otro hito importante en la comprensión de los
datos vendrá de la mano de la exploración de los datos a través
de la realización de representaciones gráficas
Este es un mundo muy rico y complejo en el entorno de R. Por ahora vamos
a pedir al programa que realice algunas representaciones destacadas de
nuestros datos de Brain Training.
# Los puntos de datos en la medida
plot(BrainTrain$Memoria)
# Para los puntos de datos en función de la variable de agrupación
with(BrainTrain, dotchart(Memoria,groups = Grupos))
# Para obtener una representación a partir del resumen de los datos
with(BrainTrain, plot(Grupos,Memoria))
# Que en este caso es equivalente a un Gráfico del tipo Box Plot a partir del modelo
boxplot(modelo)
# Al cual podemos añadir los valores de la media aritmética
points(medias,col="red",pch=18,cex=2)
En este punto sería interesante observar las diferencias entre las diferentes representaciones gráficas. Realmente la función plot es genérica, mientras que la función boxplot es más específica. Si nuestra investigación incluyese más bien la explicación de una medida a partir de una variable explicativa de carácter cuantitativo (como en el caso de Regresión Lineal), la función genérica habría invocado a un gráfico de dispersión.
# Incorporamos ahora puntuaciones de Atención a nuestro entorno de trabajo
Atencion <- c(10,7,6,7,3,4,6,7,9,2,9,8)
Nuevomodelo<-as.formula(BrainTrain$Memoria ~ Atencion)
# Y constatamos que la función plot invoca a un diagrama de dispersión
plot(Nuevomodelo,xlab="Memoria", ylab = "Atención", main="Estudio de Brain Training")
# Al cual podemos incorporar la Linea de Regresión Lineal
abline(lm(Nuevomodelo),col="red")
# Y la función de pérdida
lines(predict(loess(Nuevomodelo)), col='blue')
La comparación de las dos funciones pone de manifiesto que el modelo
Lineal supone una representación mejor de nuestros datos, en comparación
a la función de pérdida. Conforme profundicemos en el curso podremos
constatar que las funciones de pérdida a veces nos aportan pistas
respectos a funciones curvilíneas (no lineales) más complejas, e incluso
pueden convertirse en la opción más razonable.
Por otro lado, habrá tenido ocasión de familiarizarse con algunos de los
parámetros más destacados para el manejo de las representaciones
gráficas: colores, tipo de símbolo y su tamaño, leyendas de los ejes,
entre otras.
Para familiarizarse con los Gráficos para Exploración de Datos:
6) Terminamos esta introducción con los ficheros de datos, la manera de almacenar la información
#Fichero de datos
write.csv2(BrainTrain, file="ResEjem2.csv", row.names = FALSE)
# Resultados del análisis
capture.output(anova(ModLin), file="ResEjem1.txt",append=T)
# Gráficos
pdf("ResBrainT.pdf")
boxplot(modelo)
points(medias,col="red",pch=18,cex=2)
dev.off()
## quartz_off_screen
## 2
# Mejor, organizar resultados mediante listas y almacenar datos,
# resultados y funciones específicas
# Creamos una lista Vacía y en diferentes campos de la misma
# almacenamos los diferentes resultados
ResAn<-list()
ResAn$Medias<-medias
ResAn$Resumen<-summary(ModLin)
ResAn$ANOVA<-anova(ModLin)
ResAn
## $Medias
## BrainT VideoJ RepVideoJ
## 8 6 6
##
## $Resumen
##
## Call:
## lm(formula = modelo, data = BrainTrain)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.0 -1.0 0.5 1.0 2.0
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.000 1.054 7.589 3.36e-05 ***
## GruposVideoJ -2.000 1.491 -1.342 0.213
## GruposRepVideoJ -2.000 1.491 -1.342 0.213
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.108 on 9 degrees of freedom
## Multiple R-squared: 0.2105, Adjusted R-squared: 0.03509
## F-statistic: 1.2 on 2 and 9 DF, p-value: 0.3452
##
##
## $ANOVA
## Analysis of Variance Table
##
## Response: Memoria
## Df Sum Sq Mean Sq F value Pr(>F)
## Grupos 2 10.667 5.3333 1.2 0.3452
## Residuals 9 40.000 4.4444
capture.output(ResAn, file="ResEjem.txt",append=T)
ResAn$ETM<-tapply(Memoria, Grupos, ETM)
save(BrainTrain, ETM, ResAn, file = "BrainTrain.RData")
Una vez que tiene almacenados los objetos, todo lo que tendrá que hacer en el futuro es cargar el fichero. Para ello podría probar a borrar toda la información cargada en memoria de trabajo y cargar los objetos a partir del siguiente comando:
load("BrainTrain.RData")
Para familiarizarse con los Ficheros:
Si desea iniciar una sesión de trabajo a partir únicamente de los datos, lo recomendable sería:
PathDesign="/Volumes/RMmRa21/Cursos/Doctorado 24/" # Sustituir el trayecto por el suyo propio
NmFich="BrainTrain.csv";
NmFich<-paste0(PathDesign,NmFich);
BrainTrain <- read.csv2(NmFich, header=TRUE)
# O bien desde un acceso a internet:
BrainTrain <- read.csv2(
"https://drive.google.com/uc?export=download&id=1hL1JDVyR8XomOuGsO6UxHUmWJP7dO4Yd",
header=TRUE)
Con objeto de acceder a los ficheros almacenados en gdrive, primero tendrá que generar el trayecto adecuado, introduciendo el hipervínculo generado por gdrive en aplicaciones como Google Drive Direct Link Generator
Si desea profundizar en el manejo del entorno R Studio, los siguientes documentos le resultarán de gran ayuda:
Manuel Miguel Ramos Álvarez
Metodología de las Ciencias del Comportamiento
Dpto. Psicología, Universidad de Jaén, España
Grupo de investigación de Psicología Comparada
mramos@ujaen.es
http://www4.ujaen.es/~mramos